Thực đơn
Ruby_(ngôn_ngữ_lập_trình) Ví dụLưu ý: Các ví dụ sử dụng chuỗi ký tự Unicode để chạy được cần đặt một biến môi trường là $KCODE="u". Hay là chạy #ruby với tùy chọn là -K u vẫn được. Xem thêm những hạn chế của phiên bản Ruby hiện tại với Unicode tại ruby và unicode
1 # Mọi thứ, kể cả tầm thường nhất, là một đối tượng. Vì thế những ví dụ dưới đều chạy được:2 -199.abs # => 199, abs: giá trị tuyệt đối3 "ruby is cool".length # => 124 "Rick".index("c") # => 25 "Nice Day Isn't It?".split(//).uniq.sort.join # => " '?DINaceinsty"
print 'Làm ơn gõ tên >'name = gets.chompputs "Chào #{name}."
1 puts 'Cho tôi con số của bạn'2 number = gets.chomp3 puts number.to_i4 output_number = number.to_i + 15 puts output_number.to_s + ' là một con số lớn hơn.'
Khởi tạo và sử dụng một mảng:
a = [1, 'chào', 3.14, 1, 2, [4, 5]]a[2] # => 3.14a.reverse # => [[4, 5], 2, 1, 3.14, 'chào', 1]a.flatten.uniq # => [1, 'chào', 3.14, 2, 4, 5]
Khởi tạo và xây dựng một mảng kết hợp (Ruby gọi là hash):
hash = Hash.new # Tương đương với hash = {}hash = {:water => 'wet',:fire => 'hot'} # Đoạn mã đầu trở nên dư thừa khi # đưa cho hash một đối tượng hash riêng biệt mớiputs hash[:fire] # Xuất ra "hot"hash.each_pair do |key, value| # Hoặc: hash.each do |key, value| puts "#{key} is #{value}"end# Trả về {:water => 'wet',:fire => 'hot'} và xuất ra:# water is wet# fire is hothash.delete:water # Hủy cặp giá trị:water => 'wet' và trả về "wet"hash.delete_if {|key, value| value == 'hot'} # Hủy cặp giá trị:fire => 'hot' và trả về {}
Mệnh đề If:
# Tạo ra một số ngẫu nhiên và in ra số đó là chẵn hay lẻ.if rand(100) % 2 == 0 puts "Là số chẵn"else puts "Là số lẻ"end
2 cách để tạo một đoạn block:
{ puts 'Xin chào, thế giới!' } # lưu ý dấu ngoặc# hoặc:do puts 'Xin chào, thế giới!'end
Một block có thể được truyền đến một hàm (method) như một tham số tùy chọn. Nhiều hàm được cài sẵn có tham số như vậy:
File.open('file.txt', 'w') do |file| # 'w' biểu thị "chế độ ghi chép" file.puts 'Viết gì đó'end # Tập tin sẽ tự động đóng ở đâyFile.readlines('file.txt').each do |line| puts lineend# => 'Viết gì đó'
Thông số đi qua block để trở thành closure (ví dụ):
1 # Trong một biến thể hiện đối tượng (biểu thị bằng '@'), hãy lưu block này. 2 def remember(&p) 3 @block = p 4 end 5 6 # Dùng hàm trên, cho block đó một cái tên. 7 remember {|ten| puts "Xin chào, #{ten}!"} 8 9 # Dùng closure (lưu ý rằng điều này không có áp dụng tự do cho các biến khác):!10 @block.call("Tèo") # Xuất ra "Xin chào, Tèo!"
Tạo ra một hàm ẩn danh:
proc {|arg| puts arg}Proc.new {|arg| puts arg}lambda {|arg| puts arg}->(arg) {puts arg} # được giới thiệu ở Ruby 1.9
Trả về closure từ một hàm:
def create_set_and_get(initial_value=0) # Lưu ý initial_value là 0 closure_value = initial_value [ Proc.new {|x| closure_value = x}, Proc.new { closure_value } ]endsetter, getter = create_set_and_get # Trả về hai giá trịsetter.call(21)getter.call # => 21# Biến tham số cũng có thể được sử dụng như là một liên kết cho closure,# Vậy nên hàm trên có thể được viết lại như sau:def create_set_and_get(closure_value=0) [ proc {|x| closure_value = x }, proc { closure_value } ]end
Trong một hàm, có thể thay đổi block vào lúc gọi hàm:
1 def bfs(e) 2 q = [] 3 e.mark 4 yield e 5 q.push e 6 while not q.empty? 7 u = q.shift 8 u.edge_iterator do |v| 9 if not v.marked?10 v.mark11 yield v12 q.push v13 end 14 end15 end16 bfs(e) {|v| puts v}
Duyệt lần lượt trên enumation và mảng bằng cách dùng block:
1 a = [1, 'chào', 3.14]2 a.each {|item| puts item} # Xuất ra toàn bộ phần tử3 (3..6).each {|num| puts num} # Xuất ra các số từ 3 đến 6
Block cũng có thể dùng với các hàm dựng sẵn:
1 File.open('taptin.txt', 'w+b') do |taptin|2 taptin.puts 'Viết linh tinh gì đó.'3 end # File được tự động đóng lại tại đây
Hay:
1 IO.readlines('taptin.txt') do |dòng|2 # Xử lý từng dòng ở đây.3 end
Sử dụng enumeration và block để xuất ra lũy thừa 2 của các số từ 1 đến 10:
(1..10).collect {|x| x*x} => [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Đoạn mã sau định nghĩa một lớp tên là Person
. Bên cạnh phương thức khởi tạo initialize
, là phương thức được gọi đến khi cần tạo đối tượng mới, lớp này còn có 2 phương thức khác: một là ghi đè lên toán tử so sánh <=> (vì thế Array#sort
có thể sắp xếp theo tuổi) và hai là là ghi đè lên phương thức to_s
(vì thế Kernel#puts
có thể định dạng đầu ra của nó). Ở đây, attr_accessor
là một ví dụ của meta-programming trong Ruby: nó định nghĩa các phương thức dạng getter và setter của biến thực thể, trong khi attr_reader
các phương thức dạng 'getter'. Và, câu lệnh cuối cùng trong một phương thức là giá trị trả về của nó, điều này cho phép bỏ qua lệnh return
.
1 class Person 2 attr_reader:name,:age 3 def initialize(name, age) 4 @name, @age = name, age 5 end 6 def <=>(person) # Định nghĩa toán tử so sánh 7 @age <=> person.age 8 end 9 def to_s10 "#{@name} (#{@age})"11 end12 end13 14 group = [15 Person.new("Bob", 33),16 Person.new("Chris", 16),17 Person.new("Ash", 23)18 ]19 20 puts group.sort.reverse
Đoạn mã trên in ra ba tên theo tuổi giảm dần:
Bob (33)Ash (23)Chris (16)
Một trường hợp ngoại lệ được đưa ra với lệnh raise
:
raise
Có thể thêm một thông báo tùy chọn:
raise "Đây là một thông báo"
Ngoại lệ cũng có thể xác định bởi các lập trình viên:
raise ArgumentError, "Tranh luận bất hợp pháp!"
Ngoài ra, một thực thể của lớp Ngoại lệ có thể tạo ra được với biến raise
như sau:
raise ArgumentError.new("Tham số không phù hợp!")
Có thể tìm thấy các code mẫu của Ruby dưới dạng các thuật toán tại:
Thực đơn
Ruby_(ngôn_ngữ_lập_trình) Ví dụLiên quan
Ruby Ruby (ngôn ngữ lập trình) Ruby thủy quái tuổi teen Ruby Mazur Ruby Rose Ruby Yayra Goka Ruby (ca sĩ Ai Cập) Ruby Ring Ruby Laffoon Ruby RidgeTài liệu tham khảo
WikiPedia: Ruby_(ngôn_ngữ_lập_trình) http://www.artima.com/intv/ruby4.html http://www.garyc40.com/2008/02/ruby-ky-niem-sinh-n... http://www.garyc40.com/tu-hoc-ruby/ http://redhanded.hobix.com/ http://www.informit.com/articles/article.asp?p=182... http://www.linuxdevcenter.com/pub/a/linux/2001/11/... http://www.loudthinking.com/arc/000199.html http://blog.nicksieger.com/articles/2006/10/20/rub... http://www.rubycentral.com/book/ http://ruphus.com/blog/2005/06/11/ruby-and-unicode...